home *** CD-ROM | disk | FTP | other *** search
/ CD Ware Multimedia 1995 May / cd Ware (Juegos) Epimundo.iso / DOS / C / C_ALGORI.ZIP / WFL.H < prev    next >
Encoding:
C/C++ Source or Header  |  1992-05-12  |  6.7 KB  |  228 lines

  1. #if defined (WORKFLOW_Sym)                    /* Allow compiler one copy */
  2. #else
  3. #define WORKFLOW_Sym
  4.  
  5. /***********************************************************************
  6. **+
  7. **  Module Name:  workflow.h
  8. **
  9. **  Description:  Workflow specific defines
  10. **
  11. **  Include Modules Referenced:  None.
  12. **
  13. **  Written by:  John Tal
  14. **
  15. **
  16. **  Modification history:
  17. **
  18. **  Date         Engineer     Mod #          Modification Description
  19. **
  20. **  07-Jul-1991  Tal          v 1.0-001      Initial release
  21. **
  22. ***********************************************************************/
  23.  
  24.  
  25.  
  26. #define WRK_KEY_LEN 16             /* standard key length */
  27. #define WRK_MAX_TRN_STATES 10      /* limit of transition states per profile */
  28.  
  29. #define WRK_NO_JOB  -1             /* no jobs for a process */
  30. #define WRK_DUPLICATE_ID -2
  31.  
  32.  
  33. /*
  34. **   A workflow management system is a way to coordinate several processes
  35. **   which are all processing the same set of data.   The environment
  36. **   in which the concept was developed at I2MS was for distributed Unix
  37. **   processing.   Concept was defined by Mike Peregoy and implemented by
  38. **   the I2MS Blue Shield Imaging team lead by John Tal (Spring 1991).
  39. **
  40. **   Basically, a workflow management system (WMS) is a way to 'send' jobs
  41. **   around a network through various states or queues.   A particular
  42. **   process is looking for jobs with a particular state.  Jobs it finds
  43. **   with a matching state are taken and locked for processing.  When that 
  44. **   process is finished processing a job, it resets the state to another 
  45. **   value.  This value is likely a selection value for another process.
  46. **
  47. **   Network
  48. **
  49. **     Process 1  Loads jobs into database
  50. **                Sets Jobs to state 200
  51. **
  52. **     Process 2  Looking for Jobs with state 200
  53. **                Sets completed Jobs to state 300
  54. **
  55. **     Process 3  Looking for Jobs with state 300
  56. **                Sets completed Jobs to state 400
  57. **
  58. **     Process 4  Looking for Jobs with state 300
  59. **                Deletes jobs from database
  60. **
  61. **
  62. **
  63. **    A major advantage to a WMS is the ability for the system manager to
  64. **    'customize' the operation of the system.   (Process 3 could execute
  65. **    before Process 2.)
  66. **
  67. **    A review of WMS for the right-side of the brain.....
  68. **
  69. **          All of these processes are plugged into this network
  70. **          and grab any jobs they can.  After processing, they
  71. **          set the job state so that another process can have some
  72. **          fun.
  73. **
  74. **    The program below is an example of how to use the C algorithms in
  75. **    constructing a WMS based on an in-memory database.
  76. **
  77. **    A WMS would typically be created in a library layer above the
  78. **    disk-based data-base.
  79. **
  80. **    FURTHER DEVELOPMENT
  81. **
  82. **    An evolution to the EMS (especially meaningful in a multi-tasking
  83. **    environment) would be to have each process block until a job is
  84. **    available for processing.   This would eliminate the constant
  85. **    polling to the database.   
  86. **
  87. **    To implement a priority-based scheme, you could add a priority to
  88. **    each job and change the link-list off each state node in the 
  89. **    binary tree to a heap.   The only limitation is that because most
  90. **    heaps are implemented in arrays, you would have to allocate for a
  91. **    maximum size if only one job existed at a given state.
  92. **
  93. */
  94.  
  95.  
  96.  
  97. /*
  98. **  The following item is at each node of the workflow binary tree
  99. **
  100. **  The workflow binary tree has one node for each state.   All jobs
  101. **  for the same state are connected in a link-list off of the binary
  102. **  tree node for that state.
  103. */
  104.  
  105. /*
  106. **  The workflow data (WORK_ITEM_S) is stored in a linked-list hung off
  107. **  of a binary tree.
  108. **
  109. **  The WORK_ITEM is data about each job.
  110. */
  111.  
  112. /*
  113. **  This is the workflow profile data
  114. **
  115. **  It is contained in a linked list which is belongs to a process.
  116. **
  117. **  This is a profile to describe how each 'process' is to access the data.
  118. **  A process initializes for this data once and then does queries against
  119. **  the master set of WORK_ITEM data to get a job for processing.
  120. **
  121. **  The profile data contains the selection, activation, and transition
  122. **  state values.  A process may have multiple WORK_FLOW entries as
  123. **  part of its profile.
  124. **
  125. **  The profile data would normally be stored in a file on disk.
  126. */
  127.  
  128.  
  129. /*
  130. **  The following are the array [] offsets for each type of state in the
  131. **  WORK_FLOW . sTrnState[]
  132. */
  133.  
  134. #define WRK_SEL_STATE 0
  135. #define WRK_ACT_STATE 1
  136. #define WRK_TRN_STATE 2
  137.  
  138.  
  139. class PROFILE_C
  140. {
  141.  
  142. protected:
  143.  
  144.    LLIST_C  clProfiles;
  145.  
  146. public:
  147.  
  148.    struct PROFILE_S
  149.    {
  150.        CHAR   szKey[WRK_KEY_LEN + 1];   /* Key = ID of process */
  151.        SHORT  sTrnState[10];            /* States themselves */
  152.        SHORT  sTrnStates;               /* How many states are there */
  153.    };
  154.  
  155.    typedef struct PROFILE_S  PROFILE_T;
  156.    typedef PROFILE_T * PROFILE_P;
  157.    typedef PROFILE_T ** PROFILE_PP;
  158.  
  159.  
  160. public:
  161.    PROFILE_C(VOID) {};
  162.    ~PROFILE_C(VOID) {};
  163.    SHORT Add(PROFILE_P pstProfile);
  164.    SHORT Get(PROFILE_PP ppstProfile);
  165. };
  166.  
  167. typedef PROFILE_C * PROFILE_CP;
  168. typedef PROFILE_C ** PROFILE_CPP;
  169.  
  170.  
  171.  
  172. class WORK_FLOW_C
  173. {
  174.  
  175. private:
  176.  
  177.    struct WORK_TREE_S
  178.    {
  179.        SHORT   sState;       /* the state */
  180.        LLIST_C pstList;    /* ptr to the list of jobs at that state */
  181.    };
  182.    
  183.    typedef struct WORK_TREE_S WORK_TREE_T;
  184.    typedef WORK_TREE_T * WORK_TNODE_P;
  185.  
  186.    TREE_C  clStateTree;
  187.    TREE_C  clIdTree;
  188.  
  189. protected:
  190.  
  191.    struct WORK_ITEM_S
  192.    {
  193.        SHORT  sState;   /* the state, or queue job is currently at */
  194.        CHAR   szId[WRK_KEY_LEN + 1];  /* unique identifier for job */
  195.        CHAR   szKey[WRK_KEY_LEN + 1];  /* current or last owners Id */
  196.        BOOL   fLocked;  /* is currently in use */
  197.        PVOID  pvData;   /* common data type all processes/owners are using */
  198.    };
  199.    
  200.    typedef struct WORK_ITEM_S WORK_ITEM_T;
  201.    typedef WORK_ITEM_T * WORK_ITEM_P;
  202.    typedef WORK_ITEM_T ** WORK_ITEM_PP;
  203.  
  204.    friend SHORT CompareId(PVOID pvData1,PVOID pvData2);
  205.    friend SHORT CompareNodeState(PVOID pvData1,PVOID pvData2);
  206.    friend SHORT CompareState(PVOID pvData1,PVOID pvData2);
  207. public:
  208.  
  209.    #define WRK_TRN_OK    0
  210.    #define WRK_TRN_ERR_1 1    
  211.    #define WRK_TRN_ERR_2 2
  212.  
  213.    WORK_FLOW_C(void) {};
  214.    ~WORK_FLOW_C(void) {};
  215.  
  216.    SHORT Add(PCHAR szId, SHORT sState, PVOID pvData);
  217.    SHORT Select(PROFILE_CP pclProfile, PCHAR * ppcId, PVOID * ppvData);
  218.    SHORT SetTrans(PCHAR szId, PROFILE_CP pclProfile, SHORT sTrnStateNdx);
  219.    SHORT UnLock(PCHAR pcId, PROFILE_CP pclProfile);
  220.  
  221. };
  222.  
  223. typedef WORK_FLOW_C * WORK_FLOW_CP;
  224. typedef WORK_FLOW_C ** WORK_FLOW_CPP;
  225.  
  226.  
  227. #endif
  228.